﻿/*
* SHARPUPNP
* 
* Written by Marco Minerva, mailto:marco.minerva@gmail.com
* 
* This code is released under the GNU General Public License (GPL) v2.
* A copy of this license is available at
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SharpUpnp;
using System.Net;
using System.Xml.Linq;
using System.Threading;

namespace TestApplication
{
    class Program
    {
        const int PUBLIC_PORT = 56765;

        static void Main(string[] args)
        {
            Console.WriteLine("Ricerca di periferiche NAT in corso...");
            
            //Efftua la ricerca di periferiche NAT nella sottorete.
            UpnpNatDevice[] devices = Upnp.GetNatDevices();
            
            Console.Write("Ricerca terminata.");
            if (devices.Length > 0)
            {
                UpnpResponse response = null;

                Console.WriteLine(" Sono state individuate {0} periferiche NAT.", devices.Length);
                foreach (UpnpNatDevice device in devices)
                {
                    Console.WriteLine();
                    Console.WriteLine("\tNome: {0}, IPEndPoint: {1}", device.Name, device.EndPoint);
                    IPAddress ipAddress = device.GetPublicIPAddress(out response);
                    if (ipAddress != null)
                    {
                        Console.WriteLine("\tIndirizzo IP pubblico: {0}", ipAddress);

                        Console.Write("\tProvo ad aggiungere il mapping per la porta {0} UDP...", PUBLIC_PORT);
                        if (device.AddPortMapping(PUBLIC_PORT, Protocol.UDP, out response))
                        {
                            Console.WriteLine(" Fatto.");
                            Console.Write("\tAttendo 3 secondi prima di eliminare il mapping...");
                            Thread.Sleep(3000);
                            if (device.DeletePortMapping(PUBLIC_PORT, Protocol.UDP, out response))
                            {
                                Console.WriteLine(" Fatto.");
                            }
                            else
                            {
                                Console.WriteLine(" Errore:");
                                Console.WriteLine("\t{0}", response);
                            }
                        }
                        else
                        {
                            Console.WriteLine(" Errore:");
                            Console.WriteLine("\t{0}", response);
                        }
                    }
                    else
                    {
                        Console.WriteLine("\tImpossibile determinare l'indirizzo IP pubblico della periferica. Errore: {0}", response);
                    }
                }
                Console.WriteLine();
            }
            else
            {
                Console.WriteLine(" Non sono state individuate periferiche NAT compatibili.");
            }

            Console.Write(Environment.NewLine + "Premere un tasto per terminare.");
            Console.Read();
        }
    }
}
